home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / pofo / grafik / pix / pix.c next >
C/C++ Source or Header  |  1991-08-22  |  5KB  |  206 lines

  1. /* This program demonstrates how to use BIOS calls for programming the */
  2. /* Atari Portfolio in graphics mode. The program should be compiled    */
  3. /* with Turbo C 1.5 or 2.0.                                            */
  4. /*                                                                     */
  5. /* Written by: Tommy Frandsen (frandsen@diku.dk) - 9/23/90.            */
  6.  
  7. #include <conio.h>
  8. #include <stdlib.h>
  9. #include <dos.h>
  10.  
  11. #define GRAPHIC 0x04
  12. #define TEXT    0x07
  13.  
  14. #define PIX_OFF 0
  15. #define PIX_ON  1
  16.  
  17. #define XDIM 240
  18. #define YDIM 64
  19.  
  20. #define XMIN 0
  21. #define XMAX (XDIM-1)
  22. #define YMIN 0
  23. #define YMAX (YDIM-1)
  24.  
  25. #define LINE_OLD 30
  26. #define LINE_DIF  2
  27. #define LINE_MAX 75
  28. #define RAND_INT 10
  29. #define RAND_THR  8 
  30.  
  31. void set_mode(int mode);
  32. void pixel(int x, int y, int color);
  33. void line(int x1, int y1, int x2, int y2, int color);
  34. int  test(int x, int y);
  35.  
  36. main(int argc, char *argv[])
  37. {
  38.     struct {
  39.         int x1;
  40.         int y1;
  41.         int x2;
  42.         int y2;
  43.     } old[LINE_OLD];
  44.  
  45.     int x1, y1, x2, y2;
  46.     int x1_dir=1, y1_dir=1;
  47.     int x2_dir=1, y2_dir=1;
  48.     int i;
  49.  
  50.     set_mode(GRAPHIC);
  51.  
  52.     for(i=0; i<LINE_OLD; i++) 
  53.         old[i].x1 = old[i].y1 = old[i].x2 = old[i].y2 = 0;
  54.     i = 0;
  55.  
  56.     if(argc>1)
  57.         srand(atoi(argv[1]));
  58.     x1 = x2 = rand()%XDIM;
  59.     y1 = y2 = rand()%YDIM;
  60.  
  61.     for(;;) {
  62.         if (rand()%RAND_INT>RAND_THR) 
  63.             x1_dir = -x1_dir;
  64.         if (rand()%RAND_INT>RAND_THR) 
  65.             y1_dir = -y1_dir;
  66.         if (rand()%RAND_INT>RAND_THR) 
  67.             x2_dir = -x2_dir;
  68.         if (rand()%RAND_INT>RAND_THR) 
  69.             y2_dir = -y2_dir;
  70.  
  71.         x1 += LINE_DIF*x1_dir;
  72.         y1 += LINE_DIF*y1_dir;
  73.         x2 += LINE_DIF*x2_dir;
  74.         y2 += LINE_DIF*y2_dir;
  75.         
  76.         if (x1>XMAX) x1 = XMAX;
  77.         if (y1>YMAX) y1 = YMAX;
  78.         if (x2>XMAX) x2 = XMAX;
  79.         if (y2>YMAX) y2 = YMAX;
  80.         if (x1<XMIN) x1 = XMIN;
  81.         if (y1<YMIN) y1 = YMIN;
  82.         if (x2<XMIN) x2 = XMIN;
  83.         if (y2<YMIN) y2 = YMIN;
  84.  
  85.        if ((long)(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)>LINE_MAX*LINE_MAX) {
  86.             x1 = x2 = rand()%XDIM;
  87.             y1 = y2 = rand()%YDIM;
  88.         }
  89.  
  90.         line(old[i].x1, old[i].y1, old[i].x2, old[i].y2, PIX_OFF);
  91.         old[i].x1=x1;
  92.         old[i].y1=y1;
  93.         old[i].x2=x2;
  94.         old[i].y2=y2;
  95.         line(old[i].x1, old[i].y1, old[i].x2, old[i].y2, PIX_ON);
  96.         
  97.         i = (i+1)%LINE_OLD;
  98.  
  99.         if (kbhit())
  100.             break;
  101.     }
  102.  
  103.     set_mode(TEXT);
  104. }
  105.  
  106.  
  107. /* set_mode: Use this function to move between text and graphics mode. */
  108. /*           Use set_mode(4) to set graphics mode and set_mode(7) to   */
  109. /*           set text mode.                                            */
  110. void set_mode(int mode)
  111. {
  112.     union REGS regs;
  113.  
  114.     regs.h.ah = 0;
  115.     regs.h.al = mode;
  116.     int86(0x10, ®s, ®s);
  117. }
  118.  
  119.  
  120. /* pixel: Sets or clears the pixel in (x,y). color=1 will set a pixel  */
  121. /*        and color=0 will clear a pixel. 0<=x<=239 and 0<=y<=63.      */
  122. void pixel(int x, int y, int color)
  123. {
  124.     union REGS regs;
  125.  
  126.     regs.h.ah = 0x0c;
  127.     regs.h.al = color;
  128.     regs.h.bh = 0;
  129.     regs.x.cx = x;
  130.     regs.x.dx = y;
  131.     int86(0x10, ®s, ®s);
  132. }
  133.  
  134.  
  135. /* line: Draws a line between (x1,y1) and (x2,y2). color=1 will draw a */
  136. /*       line and color=0 will clear a line. 0<=x1<=239, 0<=y1<=63,    */
  137. /*       0<=x2<=239 and 0<=y2<=63.                                     */
  138. void line(int x1, int y1, int x2, int y2, int color)
  139. {
  140.     int x, y, d, a, b;
  141.     int dx_diag, dy_diag;
  142.     int dx_nondiag, dy_nondiag;
  143.     int diag_inc, nondiag_inc;
  144.     int i, swap;
  145.  
  146.     x = x1;
  147.     y = y1;
  148.     a = x2-x1;
  149.     b = y2-y1;
  150.  
  151.     if (a<0) {
  152.         a       = -a;
  153.         dx_diag = -1;
  154.     } else 
  155.         dx_diag = 1;
  156.  
  157.     if (b<0) {
  158.         b       = -b;
  159.         dy_diag = -1;
  160.     } else 
  161.         dy_diag = 1;
  162.  
  163.     if (a<b) {
  164.         swap       = a;
  165.         a          = b;
  166.         b          = swap;
  167.         dx_nondiag = 0;
  168.         dy_nondiag = dy_diag;
  169.     } else {
  170.         dx_nondiag = dx_diag;
  171.         dy_nondiag = 0;
  172.     }
  173.  
  174.     d           = b+b-a;
  175.     nondiag_inc = b+b;
  176.     diag_inc    = b+b-a-a;
  177.  
  178.     for(i=0; i<=a; i++) {
  179.         pixel(x, y, color);
  180.         if (d<0) {
  181.             x = x+dx_nondiag;
  182.             y = y+dy_nondiag;
  183.             d = d+nondiag_inc;
  184.         } else {
  185.             x = x+dx_diag;
  186.             y = y+dy_diag;
  187.             d = d+diag_inc;
  188.         }        
  189.     }
  190. }
  191.  
  192.  
  193. /* test: Is the pixel in (x,y) set?. Returns 1 if set, otherwise 0.    */
  194. /*       0<=x<=239 and 0<=y<=63                                        */
  195. int  test(int x, int y)
  196. {
  197.     union REGS regs;
  198.  
  199.     regs.h.ah = 0x0d;
  200.     regs.h.bh = 0;
  201.     regs.x.cx = x;
  202.     regs.x.dx = y;
  203.     int86(0x10, ®s, ®s);
  204.     return(regs.h.al);
  205. }
  206.